GdkDrop *drop);
static gboolean gtk_drop_target_handle_event (GtkEventController *controller,
- const GdkEvent *event);
+ const GdkEvent *event,
+ double x,
+ double y);
static gboolean gtk_drop_target_filter_event (GtkEventController *controller,
const GdkEvent *event);
static void gtk_drop_target_set_widget (GtkEventController *controller,
static gboolean
gtk_drop_target_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkDropTarget *dest = GTK_DROP_TARGET (controller);
GdkDrop *drop;
- double x, y;
GtkDropStatus status;
gboolean found = FALSE;
if (status == GTK_DROP_STATUS_DENIED)
return FALSE;
- gdk_event_get_coords (event, &x, &y);
-
switch ((int)gdk_event_get_event_type (event))
{
case GDK_DRAG_MOTION:
static gboolean
gtk_event_controller_handle_event_default (GtkEventController *self,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
return FALSE;
}
* gtk_event_controller_handle_event:
* @controller: a #GtkEventController
* @event: a #GdkEvent
+ * @x: event position in widget coordinates, or 0 if not a pointer event
+ * @y: event position in widget coordinates, or 0 if not a pointer event
*
* Feeds an event into @controller, so it can be interpreted
* and the controller actions triggered.
**/
gboolean
gtk_event_controller_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkEventControllerClass *controller_class;
gboolean retval = FALSE;
if (controller_class->handle_event)
{
g_object_ref (controller);
- retval = controller_class->handle_event (controller, event);
+ retval = controller_class->handle_event (controller, event, x, y);
g_object_unref (controller);
}
GDK_AVAILABLE_IN_ALL
gboolean gtk_event_controller_handle_event (GtkEventController *controller,
- const GdkEvent *event);
+ const GdkEvent *event,
+ double x,
+ double y);
GDK_AVAILABLE_IN_ALL
void gtk_event_controller_reset (GtkEventController *controller);
static gboolean
gtk_event_controller_key_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkEventControllerKey *key = GTK_EVENT_CONTROLLER_KEY (controller);
GdkEventType event_type = gdk_event_get_event_type (event);
if (!gtk_widget_get_realized (widget))
gtk_widget_realize (widget);
- if (gtk_widget_run_controllers (widget, controller->current_event,
+ if (gtk_widget_run_controllers (widget, controller->current_event, 0, 0,
GTK_PHASE_CAPTURE))
return TRUE;
- if (gtk_widget_run_controllers (widget, controller->current_event,
+ if (gtk_widget_run_controllers (widget, controller->current_event, 0, 0,
GTK_PHASE_TARGET))
return TRUE;
- if (gtk_widget_run_controllers (widget, controller->current_event,
+ if (gtk_widget_run_controllers (widget, controller->current_event, 0, 0,
GTK_PHASE_BUBBLE))
return TRUE;
static gboolean
gtk_event_controller_legacy_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
gboolean handled;
static gboolean
gtk_event_controller_motion_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkEventControllerMotion *motion = GTK_EVENT_CONTROLLER_MOTION (controller);
GtkEventControllerClass *parent_class;
type = gdk_event_get_event_type (event);
if (type == GDK_ENTER_NOTIFY)
{
- double x, y;
GdkCrossingMode mode;
GdkNotifyType detail;
- gdk_event_get_coords (event, &x, &y);
gdk_event_get_crossing_mode (event, &mode);
gdk_event_get_crossing_detail (event, &detail);
}
else if (type == GDK_MOTION_NOTIFY)
{
- double x, y;
-
- gdk_event_get_coords (event, &x, &y);
-
g_signal_emit (controller, signals[MOTION], 0, x, y);
}
parent_class = GTK_EVENT_CONTROLLER_CLASS (gtk_event_controller_motion_parent_class);
- return parent_class->handle_event (controller, event);
+ return parent_class->handle_event (controller, event, x, y);
}
static void
GtkWidget *widget);
void (* unset_widget) (GtkEventController *controller);
gboolean (* handle_event) (GtkEventController *controller,
- const GdkEvent *event);
+ const GdkEvent *event,
+ double x,
+ double y);
void (* reset) (GtkEventController *controller);
/*<private>*/
static gboolean
gtk_event_controller_scroll_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkEventControllerScroll *scroll = GTK_EVENT_CONTROLLER_SCROLL (controller);
GdkScrollDirection direction = GDK_SCROLL_SMOOTH;
}
}
-static void
-_get_event_coordinates (PointData *data,
- gdouble *x,
- gdouble *y)
-{
- gdouble event_x, event_y;
-
- g_assert (data->event != NULL);
-
- gdk_event_get_coords (data->event, &event_x, &event_y);
- event_x += data->accum_dx;
- event_y += data->accum_dy;
-
- if (x)
- *x = event_x;
- if (y)
- *y = event_y;
-}
-
-static void
-_update_widget_coordinates (GtkGesture *gesture,
- PointData *data)
-{
- gdouble event_x, event_y;
-
- _get_event_coordinates (data, &event_x, &event_y);
- data->widget_x = event_x;
- data->widget_y = event_y;
-}
-
static GtkEventSequenceState
gtk_gesture_get_group_state (GtkGesture *gesture,
GdkEventSequence *sequence)
static gboolean
_gtk_gesture_update_point (GtkGesture *gesture,
const GdkEvent *event,
+ double x,
+ double y,
gboolean add)
{
GdkEventSequence *sequence;
data->event = gdk_event_ref ((GdkEvent *)event);
_update_touchpad_deltas (data);
- _update_widget_coordinates (gesture, data);
+ data->widget_x = x + data->accum_dx;
+ data->widget_y = y + data->accum_dy;
/* Deny the sequence right away if the expected
* number of points is exceeded, so this sequence
static gboolean
gtk_gesture_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkGesture *gesture = GTK_GESTURE (controller);
GdkEventSequence *sequence;
(event_type == GDK_TOUCHPAD_SWIPE && phase == GDK_TOUCHPAD_GESTURE_PHASE_BEGIN) ||
(event_type == GDK_TOUCHPAD_PINCH && phase == GDK_TOUCHPAD_GESTURE_PHASE_BEGIN))
{
- if (_gtk_gesture_update_point (gesture, event, TRUE))
+ if (_gtk_gesture_update_point (gesture, event, x, y, TRUE))
{
gboolean triggered_recognition;
{
gboolean was_claimed;
- if (_gtk_gesture_update_point (gesture, event, FALSE))
+ if (_gtk_gesture_update_point (gesture, event, x, y, FALSE))
{
if (was_recognized &&
_gtk_gesture_check_recognized (gesture, sequence))
return FALSE;
}
- if (_gtk_gesture_update_point (gesture, event, FALSE) &&
+ if (_gtk_gesture_update_point (gesture, event, x, y, FALSE) &&
_gtk_gesture_check_recognized (gesture, sequence))
g_signal_emit (gesture, signals[UPDATE], 0, sequence);
}
static gboolean
gtk_gesture_click_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkEventControllerClass *parent_controller;
GtkGestureClickPrivate *priv;
GdkEventSequence *sequence;
guint button;
- gdouble x, y;
priv = gtk_gesture_click_get_instance_private (GTK_GESTURE_CLICK (controller));
parent_controller = GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_click_parent_class);
{
if (!gdk_event_get_button (event, &button))
button = 0;
- gdk_event_get_coords (event, &x, &y);
g_signal_emit (controller, signals[UNPAIRED_RELEASE], 0,
x, y, button, sequence);
}
- return parent_controller->handle_event (controller, event);
+ return parent_controller->handle_event (controller, event, x, y);
}
static void
static gboolean
gtk_gesture_rotate_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkGestureRotate *rotate = GTK_GESTURE_ROTATE (controller);
GtkGestureRotatePrivate *priv;
priv->accum_touchpad_angle += delta;
}
- return GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_rotate_parent_class)->handle_event (controller, event);
+ return GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_rotate_parent_class)->handle_event (controller, event, x, y);
}
static void
static gboolean
gtk_gesture_single_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GdkEventSequence *sequence = NULL;
GtkGestureSinglePrivate *priv;
case GDK_TOUCH_CANCEL:
case GDK_GRAB_BROKEN:
case GDK_TOUCHPAD_SWIPE:
- return GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->handle_event (controller,
- event);
+ return GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->handle_event (controller, event, x, y);
break;
default:
return FALSE;
priv->current_button = button;
}
- retval = GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->handle_event (controller, event);
+ retval = GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->handle_event (controller, event, x, y);
if (sequence == priv->current_sequence &&
(event_type == GDK_BUTTON_RELEASE || event_type == GDK_TOUCH_END))
static gboolean
gtk_gesture_stylus_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GdkModifierType modifiers;
guint n_signal;
- gdouble x, y;
- GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_stylus_parent_class)->handle_event (controller, event);
+ GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_stylus_parent_class)->handle_event (controller, event, x, y);
if (!gdk_event_get_device_tool (event))
return FALSE;
- if (!gdk_event_get_coords (event, &x, &y))
- return FALSE;
switch ((guint) gdk_event_get_event_type (event))
{
static gboolean
gtk_pad_controller_handle_event (GtkEventController *controller,
- const GdkEvent *event)
+ const GdkEvent *event,
+ double x,
+ double y)
{
GtkPadController *pad_controller = GTK_PAD_CONTROLLER (controller);
GdkEventType event_type = gdk_event_get_event_type (event);
gboolean
gtk_widget_run_controllers (GtkWidget *widget,
const GdkEvent *event,
+ double x,
+ double y,
GtkPropagationPhase phase)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
gboolean is_gesture;
is_gesture = GTK_IS_GESTURE (controller);
- this_handled = gtk_event_controller_handle_event (controller, event);
+ this_handled = gtk_event_controller_handle_event (controller, event, x, y);
handled |= this_handled;
static gboolean
translate_event_coordinates (GdkEvent *event,
- double event_x,
- double event_y,
+ double *x,
+ double *y,
GtkWidget *widget);
gboolean
_gtk_widget_captured_event (GtkWidget *widget,
GdkEvent *event)
{
gboolean return_val = FALSE;
- double old_x, old_y;
- gboolean reset_event = FALSE;
+ double x, y;
g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
if (!event_surface_is_still_viewable (event))
return TRUE;
- if (gdk_event_get_coords (event, &old_x, &old_y))
- {
- reset_event = TRUE;
- translate_event_coordinates (event, old_x, old_y, widget);
- }
+ x = y = 0;
+ translate_event_coordinates (event, &x, &y, widget);
- return_val = gtk_widget_run_controllers (widget, event, GTK_PHASE_CAPTURE);
+ return_val = gtk_widget_run_controllers (widget, event, x, y, GTK_PHASE_CAPTURE);
return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
- if (reset_event)
- gdk_event_set_coords (event, old_x, old_y);
-
return return_val;
}
static gboolean
translate_event_coordinates (GdkEvent *event,
- double event_x,
- double event_y,
+ double *x,
+ double *y,
GtkWidget *widget)
{
GtkWidget *event_widget;
graphene_point_t p;
+ double event_x, event_y;
+
+ *x = *y = 0;
+
+ if (!gdk_event_get_coords (event, &event_x, &event_y))
+ return FALSE;
event_widget = gtk_get_event_widget (event);
&p))
return FALSE;
- gdk_event_set_coords (event, p.x, p.y);
+ *x = p.x;
+ *y = p.y;
return TRUE;
}
GdkEvent *event)
{
gboolean return_val = FALSE;
- gboolean reset_event = FALSE;
- double old_x, old_y;
+ double x, y;
/* We check only once for is-still-visible; if someone
* hides the window in on of the signals on the widget,
if (!_gtk_widget_get_mapped (widget))
return FALSE;
- if (gdk_event_get_coords (event, &old_x, &old_y))
- {
- reset_event = TRUE;
- translate_event_coordinates (event, old_x, old_y, widget);
- }
+ x = y = 0;
+ translate_event_coordinates (event, &x, &y, widget);
if (widget == gtk_get_event_target (event))
- return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_TARGET);
+ return_val |= gtk_widget_run_controllers (widget, event, x, y, GTK_PHASE_TARGET);
if (return_val == FALSE)
- return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_BUBBLE);
+ return_val |= gtk_widget_run_controllers (widget, event, x, y, GTK_PHASE_BUBBLE);
if (return_val == FALSE &&
(event->any.type == GDK_KEY_PRESS ||
event->any.type == GDK_KEY_RELEASE))
return_val |= gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *) event);
- if (reset_event)
- gdk_event_set_coords (event, old_x, old_y);
-
return return_val;
}
gboolean gtk_widget_run_controllers (GtkWidget *widget,
const GdkEvent *event,
+ double x,
+ double y,
GtkPropagationPhase phase);